/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.faimg.pomar.modelo.dao;

import br.faimg.pomar.modelo.interfaces.CRUDInterface;
import br.faimg.pomar.modelo.pojo.Produto;
import br.faimg.pomar.modelo.pojo.TipodeProduto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author flavio
 */
public class ProdutoDAO implements CRUDInterface<Produto>{

    public void create(Produto pojo) {
         Connection con = null;
         PreparedStatement stm = null;
         String sql = "insert into PRODUTO values(?,?,?,?,?);";
        
         try {

             con = ConnectionManager.getInstance().getConnection();
             stm = con.prepareStatement(sql);
             stm.setString(1, pojo.getCodigo());
             stm.setString(2, pojo.getTipo().getCodigo());
             stm.setString(3, pojo.getDescricao());
             stm.setInt(4, pojo.getQtdEmb());
             stm.setString(5, pojo.getStatus());
             stm.execute();
        
         } catch (SQLException ex) {
            Logger.getLogger(TipodeEstacaoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }finally {
            
            if (stm != null){
             
                try {
                    stm.close();
                } catch (SQLException ex) {
                    Logger.getLogger(TipodeEstacaoDAO.class.getName()).log(Level.SEVERE, null, ex);
                }
            
            }
            if (con != null){
                
                try {
                    con.close();
                } catch (SQLException ex) {
                    Logger.getLogger(TipodeEstacaoDAO.class.getName()).log(Level.SEVERE, null, ex);
                }
            
            }
        
        }
    }

    public void update(Produto pojo) {
        Connection con = null;
        PreparedStatement stm = null;
        String sql = "update PRODUTO set pdt_tpp_codigo = ?, pdt_descricao = ?, pdt_qtdemb = ?, pdt_status= ? " +
                "where pdt_codigo  = ?";
        try {

            con = ConnectionManager.getInstance().getConnection();
            stm = con.prepareStatement(sql);
            stm.setString(1, pojo.getTipo().getCodigo());
            stm.setString(2, pojo.getDescricao());
            stm.setInt(3, pojo.getQtdEmb());
            stm.setString(4, pojo.getStatus());
            stm.setString(5, pojo.getCodigo());
            stm.execute();

        } catch (SQLException ex) {
            Logger.getLogger(TipodeProdutoDAO.class.getName()).log(Level.SEVERE, null, ex);
        } finally {

            if (stm != null) {

                try {
                    stm.close();
                } catch (SQLException ex) {
                    Logger.getLogger(TipodeProdutoDAO.class.getName()).log(Level.SEVERE, null, ex);
                }

            }


            if (con != null) {

                try {
                    con.close();
                } catch (SQLException ex) {
                    Logger.getLogger(TipodeProdutoDAO.class.getName()).log(Level.SEVERE, null, ex);
                }

            }

        }

    }

    public List<Produto> readByExample(Produto pojo) {
        Connection con = null;
        PreparedStatement stm = null;
        ResultSet rs = null;

        String sql = "select * from produto,tipo_produto where  pdt_descricao" +
                " ilike ? and pdt_tpp_codigo = tpp_codigo";
        
        List<Produto> produtos = new ArrayList<Produto>();

        if (pojo == null) {

            pojo = new Produto();
        }

        if (pojo.getDescricao() == null) {

            pojo.setDescricao("");

        }

        con = ConnectionManager.getInstance().getConnection();
        try {
            stm = con.prepareStatement(sql);
            stm.setString(1, "%"+ pojo.getDescricao() +"%");
            rs = stm.executeQuery();

            while (rs.next()) {
                Produto temp = new Produto();
                TipodeProduto tipo = new TipodeProduto();
                
                temp.setCodigo(rs.getString("pdt_codigo"));
                temp.setDescricao(rs.getString("pdt_descricao"));
                tipo.setCodigo(rs.getString("tpp_codigo"));
                tipo.setDescricao(rs.getString("tpp_descricao"));
                temp.setQtdEmb(rs.getInt("pdt_qtdemb"));
                temp.setStatus(rs.getString("pdt_status"));
                temp.setTipo(tipo);
                produtos.add(temp);
            }

        } catch (SQLException ex) {
            Logger.getLogger(TipodeProdutoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return produtos;
    }

    
    public Produto readById(Character codigo) {
        throw new UnsupportedOperationException("Não é utilizado.");
    }

    public void delete(Character codigo) {
        throw new UnsupportedOperationException("Não é utilizado.");
    }

    public Produto readById(String codigo) {
        Connection conn = null;
        PreparedStatement stm = null;
        Produto produto = null;
        ResultSet rs = null;
        String sql = "Select * from PRODUTO where PDT_CODIGO = ?";
        try {
            conn = ConnectionManager.getInstance().getConnection();
            stm = conn.prepareStatement(sql);
            stm.setString(1, codigo.toString());
            rs = stm.executeQuery();
            if (rs.next()){
                produto = new Produto();
                TipodeProdutoDAO tipoProdutoDAO = new TipodeProdutoDAO();
                produto.setCodigo(rs.getString("PDT_CODIGO"));
                produto.setDescricao(rs.getString("PDT_DESCRICAO"));
                produto.setTipo(tipoProdutoDAO.readById("PDT_TPP_CODIGO"));
                produto.setQtdEmb(rs.getInt("PDT_QTDEMB"));
                produto.setStatus(rs.getString("PDT_STATUS" ));
            }
          } catch (Exception ex) {
            Logger.getLogger(TipodeProdutoDAO.class.getName()).log(Level.SEVERE, null, ex);
          }
            finally{
        	try{
                    stm.close();
		}catch(Exception ex){
                    Logger.getLogger(TipodeProdutoDAO.class.getName()).log(Level.SEVERE, null, ex);
                }
                    try{
                        conn.close();
                    }catch(Exception ex){
                        Logger.getLogger(TipodeProdutoDAO.class.getName()).log(Level.SEVERE, null, ex);
                    }				
            }
            return produto;
    }
    
    public void delete(String codigo) {
        throw new UnsupportedOperationException("Not supported .");
    }

    public Produto readById(Integer codigo) {
        throw new UnsupportedOperationException("Não é utilizado.");
    }

    public void delete(Integer codigo) {
        throw new UnsupportedOperationException("Não é utilizado.");
    }
}
